/**
 * @description: 如果只是单纯的使用webSoket连接ue调用此方法
 * @author: 王琛
 * @Date: 2022-12-28 15:20:48
 * @param {*}
 * @return {*}
 */

export class initWebSocket {
	_ws = null;
	_ws_state = 0;
	// 断开连接的时候缓存的数据
	_cache_notSent = [];
	// 断开重连的定时器
	_reconnect = null;
	
	// 发送数据
	toUe({FuncName, Args}) {
		const initUeData = {
			FuncName,
			Args,
			timeStamp: String(+new Date())
		}
		console.log('%c日志-[UE传送数据]-socket', 'color:#fff;fontSize:15px;background:#993366;padding:2px 5px;border-radius:6px', initUeData);
		// 如果连接成功了,就发送数据,如果没有就直接缓存;
		if (this._ws.readyState == 1 && this._ws?.send) {
			this._ws.send(JSON.stringify(initUeData));
		} else {
			this._cache_notSent.push(initUeData);
		}
	}
	
	constructor({ip, message, initFn, closeAndErrorFn}) {
		try {
			if (!ip) throw new Error('ip地址不正确');
			
			// 创建连接
			this._ws = new WebSocket(ip);
			// 传输信息
			this._ws.onmessage = (data) => {
				
				// 获取解析的数据
				data.data.text().then(data => {
					console.log('%c日志-[UE回馈字符串数据]-socket', 'color:#fff;fontSize:15px;background:#993366;padding:2px 5px;border-radius:6px', data);
					// 解析数据
					const data_Config = JSON.parse(data);
					console.log('%c日志-[UE回馈的数据]-socket', 'color:#fff;fontSize:15px;background:#993366;padding:2px 5px;border-radius:6px', data_Config);
					// 返出数据
					message(data_Config)
				})
				
			}
			// 我连接成功了
			this._ws.onopen = () => {
				this._ws_state = 2;
				console.log('%c日志-[Socket连接状态]-socket-连接成功', 'color:#fff;fontSize:15px;background:#993366;padding:5px 8px;border-radius:6px');
				for (let i = 0, len = this._cache_notSent.length; i < len; i++) {
					const _cache_notSent_item = this._cache_notSent[i];
					this.toUe(_cache_notSent_item)
				}
				this._cache_notSent = [];
				
				
				initFn.forEach(e => this.toUe(e))
				
			}
			// 报错
			this._ws.onerror = (err) => {
				this._ws_state = 1;
				if (closeAndErrorFn) closeAndErrorFn();
				console.log('%c日志-[Socket连接状态]-socket-连接错误', 'color:#fff;fontSize:15px;background:#993366;padding:5px 8px;border-radius:6px', err);
			};
			// 关闭了
			this._ws.onclose = () => {
				this._ws_state = 1;
				if (closeAndErrorFn) closeAndErrorFn();
				// 累计重连次数
				let _reconnect_count = 0;
				console.log('%c日志-[Socket连接状态]-socket-连接关闭', 'color:#fff;fontSize:15px;background:#993366;padding:5px 8px;border-radius:6px');
				// 断开重连
				// this._reconnect = setInterval(() => {
				// 如果是断开状态就重连
				if (this._ws_state === 1) {
					if (this._ws?.close) this._ws.close(
						1000,
						"我主动关闭的"
					);
					this._ws = new WebSocket(ip);
					_reconnect_count++;
					console.warn('%c日志-103913', 'color:#fff;fontSize:15px;background:#993366;padding:2px 5px;border-radius:6px', "重连次数", ip, _reconnect_count);
				} else {
					clearInterval(this._reconnect);
				}
				// }, 5000)
			};
		} catch (err) {
			console.log('%c日志-[Socket连接状态]-socket-类初始化失败', 'color:#fff;fontSize:15px;background:#993366;padding:5px 8px;border-radius:6px', err);
		}
		
		
		return this;
	};
}

/**
 * @description: 检查url是否合法,合法返回true,不合法返回false,不合法的url会报错,所以要try catch一下,不然会报错,导致后面的代码不执行
 * @author: 王琛
 * @Date: 2023-07-06 10:29:56
 * @param {*}
 * @return {*}
 */

function checkUrl(str_url) {
	var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
		+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
		+ "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
		+ "|" // 允许IP和DOMAIN（域名）
		+ "([0-9a-z_!~*'()-]+\.)*" // 域名- www.
		+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名
		+ "[a-z]{2,6})" // first level domain- .com or .museum
		+ "(:[0-9]{1,4})?" // 端口- :80
		+ "((/?)|" // a slash isn't required if there is no file name
		+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
	var re = new RegExp(strRegex);
	if (re.test(str_url)) {
		return true;
	} else {
		return false;
	}
}